///--- Robaczki XL v1.3 - Marian Awgl - PL 2018-23 ---XL-- --///
#include <fstream>
#include <iostream>
#include <allegro5/allegro.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_primitives.h>
#include <allegro5/allegro_ttf.h>
#include <allegro5/allegro_audio.h>
#include <allegro5/allegro_acodec.h>
using namespace std;

ALLEGRO_DISPLAY *okno = NULL;                 // inicjacja okna/ekranu
ALLEGRO_BITMAP *el,*obr,*bufor,*tlo,*gg,*gg1,*tm = NULL;  // inicjacja bitmapy
ALLEGRO_KEYBOARD_STATE klawisz;               // klawisze klawiatury
ALLEGRO_MOUSE_STATE myszka;                   // myszka
ALLEGRO_FONT *f16,*f20,*f22,*f26,*f30 = NULL; // czcionki
ALLEGRO_SAMPLE *samp0,*samp1,*samp2,*samp3, *muz = NULL;  // sample
///  ALLEGRO_SAMPLE_INSTANCE *instance+562;
//--- zmienne ---
int mx,my,mb,mz; // dla myszki
int x=13,y=20;   // przesuniecie kafli wzgledem ekranu
const int a=50;  // wielkosc stala - bok kafla
const int xx=21; // liczba kafli poziomo
const int yy=16; // ...    i pionowo
int kaf[xx][yy]; // obraz kafli (tła)
int ele[xx][yy]; // elementy na planie
int wyniki[55];  // ilość ruchu na planszach
string tt[55];   // tablica tekstów z pliku
int sx,sy;       // wsp. sprita
int rob;         // ilość 'robaków' na planie
int dd;
int traf;
int poz;         // numer planszy
int nr;          // ""
int mu;          // dżwięki on/off
int sz;          // szybkość kuli
int przes;       // licznik przesunięć kafla
int pp;          // używane przy wpisaniu tekstu "pola, pól'
float speed;     // stopień szybkości kulki
int wyb;         // używane przy wyborze planszy
int odbl;        // licznik odblokowanych plansz
int ekr=0;
//
void init()      // instalowanie 'narzedzi'
{
    al_init();                 // Allegro 5
    al_install_keyboard();     // klawiatura
    al_install_mouse();        // myszka
    al_init_image_addon();     // obrazy/grafika
    al_init_primitives_addon();//
    al_init_ttf_addon();       // czcionki skalowane
    srand( time( NULL ) );     // konkretne liczby losowe
    al_install_audio();        // dzwieki
    al_init_acodec_addon();    // kodeki muzyki
    al_reserve_samples(4);    // rezerwacja pamieci dla sampli

    if(ekr==0)   al_set_new_display_flags(ALLEGRO_WINDOWED);
    if(ekr==1)   al_set_new_display_flags(ALLEGRO_FULLSCREEN); // pełny ekran
    okno = al_create_display( 1024, 768 );          // rozmiar okna gry
    al_set_window_title( okno, "Robaczki XL v1.3"); // nazwa okna
    bufor = al_create_bitmap(1024,768);             // wielkość bitbapy
    obr   = al_create_bitmap(1024,768);             //
    tlo   = al_create_bitmap(1024,768);
    tm  = al_load_bitmap("media/tm.png");
    gg   = al_create_bitmap(1024,768);
    el  = al_load_bitmap("media/gr333.png");           // załadowanie obrazka
    al_convert_mask_to_alpha( el, al_map_rgb(255,0,255) ); //maska
    gg1  = al_load_bitmap("media/mil2.png");
    f30 = al_load_ttf_font( "media/palab.ttf",40, 0 ); // ladowanie czcionki
    f26 = al_load_ttf_font( "media/palab.ttf",26, 0 ); // ladowanie czcionki
    f22 = al_load_ttf_font( "media/pala.ttf",22, 0 );  // ''
    f20 = al_load_ttf_font( "media/pala.ttf",18, 0 );  // ''
    f16 = al_load_ttf_font( "media/pala.ttf",16, 0 );  // ''
    samp0 = al_load_sample( "media/s0.wav" );     // ładowanie sampla
    samp1 = al_load_sample( "media/s2.wav" );     //
    samp2 = al_load_sample( "media/s2.wav" );    //
    samp3 = al_load_sample( "media/s3.wav" );     //
    muz = al_load_sample( "media/Faithful-Love-The-Coronets.ogg" );     //
    float al_get_sample_instance_gain(const ALLEGRO_SAMPLE_INSTANCE *samp0);
    fstream plik;                                 // zmienna dla operacji na plikach
    plik.open("media/tekstyXL.txt", ios::in );      // otwarcie pliku
    for(int i=0; i<50; ++i) getline(plik,tt[i]);  // pobranie tekstów
    plik.close();
    //--- szykowanie kafla przezroczystego
    al_set_target_bitmap(el);
    al_draw_tinted_bitmap_region(el,al_map_rgba(40,140,140,66),a*3,a,a,a,a,a,0);
    al_draw_bitmap_region(el,a*4,0,a,a,a,a,0);
    al_set_target_backbuffer(okno);
    //----
}

void mouse()    // myszka - przyporzadkowanie zmiennych
{
    mz=0;                 // zadeklarowana strefa na korej jest strzalka
    mx=myszka.x;          // miejsce strzalki 'x'
    my=myszka.y;          // miejsce strzalki 'y'
    mb=myszka.buttons;    // klawisz myszki '0,1,2,3'
    al_get_mouse_state( & myszka); // czy wcisniety klawisz myszki
    // --- szykowanie stref ---
    // dla main()
    if(mx>743 && mx<796 && my>y && my<y+18) mz=101;
    if(mx>817 && mx<897 && my>y && my<y+18) mz=102;
    if(mx>916 && mx<976 && my>y && my<y+18) mz=103;

    // dla funkcji wyboru planszy
    int b=0;
    for(int j=0; j<5; ++j)
        for(int i=0; i<10; ++i)
        {
            ++b;
            if(mx>500+45*i && mx<500+45*i+40 && my>180+30*j && my<180+30*j+27)  mz=b;
        }
    if(mx>635 && mx<762 && my>437 && my<461 ) mz=99; // powrót do gry z funkcji wyboru};

    // dla menu
    for(int i=0; i<4; ++i)
        if(mx>a*7+35 && mx<a*7+35+260 && my>a*5+35+15+35*i && my<a*5+35+10+35*i+27) mz=61+i;
}

void wczytanie_mapy()
{
    //--- szykowanie nazwy pliku w/g wylosowanej kategorii --------
    int nt=(nr-1)/10+1;

    string pp="media/mar"; //ścieżka pliku i początkowa nazwa (h)
    //---- zamiana zmiennej int na string
    string tmp;
    itoa(nt, (char*)tmp.c_str(), 10);
    string str = tmp.c_str();
    //---------------------------------------
    pp=pp+str; //dodanie numeru
    pp=pp+".jpg"; // dodanie rozszeżenia = gotowa nazwa pliku

    tlo = al_load_bitmap(pp.c_str());
    for(int j=0; j<yy; ++j)for(int i=0; i<xx; ++i) ele[i][j]=0; // zerowanie mapy
    rob=0;
    int b=0;
    fstream plik;
    plik.open("media/mapy30.txt", ios::in ); //otwarcie pliku
    plik.seekg(29+1044*(nr-1));                 // wybor mapy
    getline(plik,tt[0]);

    for(int j=0; j<yy; ++j)
        for(int i=0; i<xx; ++i)
        {
            plik >> b;                   // odczytanie danych z pliku
            if (b<5 )  kaf[i][j]=b;       // kafle planu
            if(b==7) kaf[i][j]=3, ++rob;
            if (b>4 && b!=7)  kaf[i][j]=2;       // kafle planu pod obiektami
            if (b==5 ) ele[i][j]=b;       // obiekty przesuwane
            if(b==7)  ele[i][j]=5;
            if (b==6) sx=i*a-x,sy=j*a-y; // wsp. sprita
            if (b==3) ++rob;             // liczba robali na planie
        }
    plik.close(); // zamyka plik
    ///   robak=3, klatka=5, robak w klatce =7

}
void start_planu()
{
    wczytanie_mapy();
    al_set_target_bitmap(bufor);
    al_draw_bitmap(tlo,0,0,0);
    al_set_target_backbuffer(okno);
    for(int i=0; i<45; ++i)
    {
        al_draw_tinted_bitmap(bufor,al_map_rgba (i,i,i,i),0,0,0);
        al_rest(0.02);
        al_flip_display();
    }
    for(int j=0; j<yy; ++j)
        for(int i=0; i<xx; ++i)
        {
            al_set_target_bitmap(bufor);
            if(kaf[i][j]>1)
            {
                al_draw_bitmap_region (el,kaf[i][j]%4*a,kaf[i][j]/4*a,a,a,i*a-x,j*a-y,0);
                // klocki, rob itp.
                if(ele[i][j]%4*a && ele[i][j]/4*a )
                    al_draw_bitmap_region (el,ele[i][j]%4*a, ele[i][j]/4*a, a, a, i*a-x, j*a-y, 0);
                al_rest(0.01);
                al_play_sample(samp0, 0.5, 0.0,0.7,ALLEGRO_PLAYMODE_ONCE,0);
            }
            al_set_target_backbuffer(okno);
            //
            al_draw_bitmap(bufor,0,0,0);
            al_flip_display();
        }
}

void rysowanie_planu() // wstawienie kafli na plan
{
    al_draw_bitmap(tlo,0,0,0);
    for(int j=0; j<yy; ++j)
        for(int i=0; i<xx; ++i)
        {
            al_draw_bitmap_region (el,kaf[i][j]%4*a,kaf[i][j]/4*a,a,a,i*a-x,j*a-y,0);
            // klocki, rob itp.
            if(ele[i][j]%4*a && ele[i][j]/4*a )
                al_draw_bitmap_region (el,ele[i][j]%4*a, ele[i][j]/4*a, a, a, i*a-x, j*a-y, 0);
            if(ele[i][j]>0 && kaf[i][j]==3) ++traf ;  // licznik robali w klatce
        }
    al_draw_scaled_bitmap(el,0,160,10,36,0,13,1024,36,0);  // belka g.
    al_draw_tinted_scaled_bitmap(el,al_map_rgba(1,1,1,66),180,80,10,10,0,13+36,1024,10,0);  // belka g.
}
void ukazywanie_obrazu_mapy()
{
    al_set_target_bitmap(bufor);
    rysowanie_planu();
    al_set_target_backbuffer(okno);
    for(int i=0; i<45; ++i)
    {
        al_draw_tinted_bitmap(bufor,al_map_rgba (i,i,i,i),0,0,0);
        al_rest(0.02);
        al_flip_display();
    }
}
void znikanie_obrazu()
{
    int v=128;
    for(int i=0; i<v; ++i)
    {
        al_draw_tinted_bitmap(bufor,al_map_rgba (v-i, v-i, v-i, v+i),0, 0, 0);
        al_rest(0.003);
        al_flip_display();
    }
}
void wybieranie_planszy()
{
    ALLEGRO_COLOR sz = al_map_rgb(180,180,180);
    ALLEGRO_COLOR csz = al_map_rgb(60,60,60);
    int b=0, x=0, y=0;
    wczytanie_mapy();
    al_set_target_bitmap(obr);
    rysowanie_planu();
    al_set_target_backbuffer(okno);

    while(!al_key_down(&klawisz, ALLEGRO_KEY_ESCAPE))
    {
        al_get_keyboard_state(&klawisz); //sprawdzenie klawiatury
        mouse();
        al_draw_filled_rectangle(0,0,100,100,csz);
        al_clear_to_color(al_map_rgb(0,0,0));
        // -- numerki plansz ---
        b=0, x=500, y=180;
        for(int j=0; j<5; ++j)
            for(int i=0; i<10; ++i)
            {
                ++b;
                al_draw_bitmap_region(el,310,140,40,27,x+45*i,y+30*j,0);    // ramka c.szara
                if(b>poz && b<dd) al_draw_bitmap_region(el,310+40*3,140,40,27,x+45*i,y+30*j,0); //crerwona
                if(b==poz)  al_draw_bitmap_region(el,310+40*2,140,40,27,x+45*i,y+30*j,0);  // żółta
                if(b<poz)   al_draw_bitmap_region(el,310+40,140,40,27,x+45*i,y+30*j,0);    // zielona
                al_draw_textf( f20, csz,x+45*i+20,y+30*j+6,1," %d ",b);        // text nr/
                if(b<dd) al_draw_textf( f20, sz,x+45*i+20,y+30*j+6,1," %d ",b);// text nr/
            }
        al_draw_textf( f20, sz,720,150,1,tt[1].c_str());   // t.Wybierz planszę
        al_draw_textf( f20, sz,720,442,1,tt[2].c_str());   // t.Powrót do gry
        al_draw_rectangle(720-65,438,720+65,438+25,csz,2); // ramka przycisku
        //---------------
        if(mz>0 && mz<poz+1 && mz!=nr)
        {
            // oznaczenie wybranej planszy
            al_draw_rectangle(((mx-x)/45)*45+x-1,((my-y)/30)*30+y-1,((mx-x)/45)*45+x+41,((my-y)/30)*30+y+27,sz,1);
            nr=mz; // wybrana plansza
            wczytanie_mapy();
            al_set_target_bitmap(obr);
            rysowanie_planu();
            al_set_target_backbuffer(okno);
        }

        if(mz>poz && mz<99) mz=0; // ograniczenie stref
        if(mz==99) al_draw_rectangle(720-65,438,720+65,438+25,sz,1); // pods. ramki przycisku
        al_draw_scaled_bitmap(obr,0,0,a*21,a*15,80,y,400,300,0);   // miniaturka planszy
        al_flip_display();
        al_rest(0.001);
        if(mz>0 && mz<50 && mb==1) // wybranie planszy i powrót do gry
        {
            nr=mz; // wybrana plansza
            wyb=1;
            start_planu();
            return;
        }
        if(mz==99 && mb==1) // powrót do gry bez wybrania planszy
        {
            nr=poz;
            wczytanie_mapy();
            ukazywanie_obrazu_mapy();
            return;
        }
    }
}
void koniec()
{
    al_set_target_bitmap(obr);
    al_draw_bitmap(bufor,0,0,0);
    al_set_target_backbuffer(okno);
    //--- wstawienie kafli tła na plan ------------
    for(int j=0; j<yy; ++j)
        for(int i=0; i<xx; ++i)
        {
            al_set_target_bitmap(obr);
            al_draw_bitmap_region (el,0,a,a,a,i*a-x,j*a-y,0);
            al_set_target_backbuffer(okno);
            al_draw_bitmap(obr,0,0,0);
            al_rest(0.003);
            al_flip_display();
        }
    //----------
    float c=0.0;
    for(int i=0; i<110; ++i)
    {
        al_set_target_bitmap(obr);
        c+=0.01;
        // ukazywanie obrazka
        al_draw_tinted_scaled_rotated_bitmap_region
        (el,0,244,a*14,a*10, al_map_rgba_f (0.0, 0.0, 0.0, 0.2),0,0, a*2+140-i, a*2+120-i,c,c,0,0);
        // ukazywanie cienia obrazka
        al_draw_tinted_scaled_rotated_bitmap_region
        (el,0,244,a*14,a*10, al_map_rgba_f (1.0, 1.0, 1.0, 1.0),0,0, a*2+120-i, a*2+100-i,c,c,0,0);
        al_draw_filled_rectangle(885,20,985,744,al_map_rgba(0,0,0,2)); // ukazywanie pola wyników
        al_draw_scaled_bitmap(el,400,0,24,10,885,20,100,724,0);
        al_draw_rectangle(885,20,985,744,al_map_rgba(0,0,0,i),2);      // ukazywanie ramki pola
        al_set_target_backbuffer(okno);
        al_draw_bitmap(obr,0,0,0);
        al_rest(0.003);
        al_flip_display();
    }
    al_set_target_bitmap(obr);
    al_draw_textf( f26, al_map_rgb(0,0,0),a*4,a*10, 0,tt[3].c_str());        // t. I to już wszystko
    al_draw_textf( f20, al_map_rgb(0,0,0),a*12-10,a*10, 0,tt[4].c_str());    // t. - nowa gra
    al_draw_textf( f20, al_map_rgb(0,0,0),a*12-10,a*10+25, 0,tt[5].c_str()); // t. - koniec gry
    al_draw_textf( f20, al_map_rgb(222,222,222),930,30, 1,tt[46].c_str());   // t. Wyniki
    for(int i=0; i<40; ++i)
    {
        al_draw_textf( f20, al_map_rgb(122,166,122),935,58+i*17, 2,"%d - ",i+1);      // nr planszy
        al_draw_textf( f20, al_map_rgb(122,166,122),970,58+i*17, 2,"%d",wyniki[i+1]); // wynik
    }
    al_set_target_backbuffer(okno);
    al_draw_bitmap(obr,0,0,0);

    al_flip_display();
    poz=1, nr=1, speed=0.002;
    al_set_target_bitmap(bufor);
    al_draw_bitmap(obr,0,0,0);
    al_set_target_backbuffer(okno);
}
void gratulacje()
{
    if(wyb==0)  ++nr, poz=nr, ++odbl; // następny poziom
    if(wyb==1) nr=odbl+1, poz=nr;
    wyb=0;
    int m=0;
    // kolory---
    ALLEGRO_COLOR cz = al_map_rgb(  0,  0,  0 );    //czarny
    ALLEGRO_COLOR bi = al_map_rgb( 222, 222, 222 ); //biały
    ALLEGRO_COLOR sz = al_map_rgb( 120, 180, 180 ); //szary
    ALLEGRO_COLOR zi = al_map_rgb( 111, 222, 111 ); //zielony
    ALLEGRO_COLOR zo = al_map_rgb( 200, 200, 111 ); //zolty

    al_save_bitmap("ekran.png",al_get_backbuffer(okno)); //zapisanie aktualnego obrazu okna
    bufor = al_load_bitmap("ekran.png");                 // załadowanie zapisanego obrazu

    al_set_target_bitmap(obr);     // otwarcie bitmapy
    al_draw_bitmap(bufor,0,0,0);
    //--- przyciemnienie górnej belki
    for(int i=0; i<21; ++i)
        al_draw_tinted_scaled_bitmap(el,al_map_rgba( 1,1,1,8 ),a*3,a,10,10,0,12,1024,38,0);
    //---
    al_set_target_bitmap(gg);     // otwarcie bitmapy
    int tx= al_get_text_width(f30,tt[6].c_str());
    tx=tx/2+50;
    //ciemniejsze tło obszaru ramki
    al_draw_filled_rectangle (512-tx,a*5,512+tx,a*8+a/3, al_map_rgba(0,0,0,150 ));
    al_draw_rectangle(512-tx,a*5,512+tx,a*8+a/3,cz,8);         //ramka czarna
    al_draw_rectangle(512-tx,a*5,512+tx,a*8+a/3,zi,2);         //ramka zielona
    al_draw_textf( f30, cz,512-1,a*5+18, 1, tt[6].c_str()); // t. GRATULACJE
    al_draw_textf( f30, cz,512,a*5+18-1, 1,tt[6].c_str());
    al_draw_textf( f30, cz,512+1,a*5+18, 1,  tt[6].c_str());
    al_draw_textf( f30, cz,512,a*5+18+1, 1,tt[6].c_str());
    al_draw_textf( f30, zo,512,a*5+18,  1, tt[6].c_str());
    if(nr<dd) al_draw_textf( f22, sz,512,a*5+60, 1, tt[7].c_str(),nr-1);  //t. Plansza nr...
    if(nr==dd) al_draw_textf( f22, zo,512,a*5+60, 1, tt[8].c_str(),nr-1); //t. Ostatnia...
    wyniki[nr-1] = przes; // wstawienie licznika przesunięć do tablicy
    pp=0; // dla słowa 'pola'
    if(przes % 10==2 or przes % 10==3 or przes%10==4) pp=1; // dla słowa 'pól'
    if(pp==0)  al_draw_textf( f22, sz,512,a*6+40, 1, tt[9].c_str(),przes); //t.
    if(pp==1)  al_draw_textf( f22, sz,512,a*6+40, 1, tt[10].c_str(),przes); //t.
    if(nr<dd)  al_draw_textf( f22, bi,512,a*6+85, 1, tt[11].c_str());
    if(nr==dd) al_draw_textf( f22, bi,512,a*6+85, 1, tt[12].c_str()); // ostatnia
    al_set_target_backbuffer(okno);  // powrót do głównej bitmapy

    if(mu==0) al_play_sample(samp3, 1.4, 0.0, 1.0,ALLEGRO_PLAYMODE_ONCE,0); //sample3

    //---  ruchom okienko GRATULACJE ---
    float ff=0.001 ;
    for(int i =0; i<250; ++i)
    {
        if(i<245 && i%15==0)  ff=ff+0.001;
        al_draw_bitmap(obr,0,0,0);
        al_draw_bitmap(gg,0,-249+i,0);
        al_rest(ff);
        al_flip_display();
    }

    int z=100, zz=0, r=0,v=0,c=0,e=0,p=0;
    float volume=.7;

    while(!al_key_down(&klawisz, ALLEGRO_KEY_ESCAPE))
    {
        al_get_keyboard_state(&klawisz); //sprawdzenie klawiatury
        al_draw_bitmap(obr,0,0,0);

        //
        if(z==120)zz=0;
        if(z==220)zz=1;
        if(zz==0)++z;
        if(zz==1)--z;
        if(z%10==0) ++r;
        if(z%44==0 && e==0  && v<20) ++c;
        if(z%44==0 && e==1 && v>85) --c;
        if(r>86) r=0,++m,++v;
        if(m>1) m=2;
        if(c>254) e=1;
        if(c<1)  e=0;
        if(v>3  && z%15==0) ++p; //dla przesuwanego tekstu
        if(p>1800)  p=0; // ''

        if(poz>1 and nr<dd)
            al_draw_bitmap(gg,0,0,0), al_draw_rectangle(512-tx,a*5,512+tx,a*8+a/3,al_map_rgb(0,z,50),2); //ramka zielona

        if(poz>1 and nr==dd)
        {
            if(m==1)  al_play_sample(muz, volume, 0.0, 1.0,ALLEGRO_PLAYMODE_ONCE,0);
            al_draw_rectangle(512-tx,a*5,512+tx,a*8+a/3,al_map_rgb(0,200,50),4); //ramka zielona

            al_draw_tinted_bitmap(tlo,al_map_rgba(c,c,c,c),0,0,0);
            al_draw_tinted_bitmap(gg1,al_map_rgba(c,c,c,c),200,150,0);
            al_draw_textf( f26, bi,a*6,a*2, 1, "%d / 100",v); // licznik trwaqnia muzyki
            al_draw_bitmap(tm,1300-p,668,0);
            if(v>1 && v<100)   al_draw_rectangle(512-tx-r-5,a*5-r-5,512+tx+r+5,a*8+a/3+r+5,al_map_rgba(55,55,55,r),10-r/5);  //ramka biała znikająca
            al_draw_bitmap(gg,0,0,0);
        }
        // gdy jeszcze są planszeo
        if ( poz<dd && (al_key_down(&klawisz, ALLEGRO_KEY_ENTER) or al_key_down(&klawisz, ALLEGRO_KEY_PAD_ENTER)))
        {
            al_save_bitmap("ekran.png",al_get_backbuffer(okno)); //zapisanie aktualnego obrazu okna
            bufor = al_load_bitmap("ekran.png");                 // załadowanie zapisanego obrazu
            al_draw_bitmap(bufor,0,0,0);
            al_flip_display();
            znikanie_obrazu();
            wczytanie_mapy();
            ukazywanie_obrazu_mapy();
            al_destroy_bitmap ( gg );
            gg = al_create_bitmap(1024,768);
            return;
        }

        al_rest(0.002);
        al_flip_display();
        // --- gdy koniec gry ---
        if (al_key_down(&klawisz, ALLEGRO_KEY_ENTER) or al_key_down(&klawisz, ALLEGRO_KEY_PAD_ENTER) or v>102)
        {
            v=0;
            al_stop_samples();
            poz=1,nr=0, odbl=0;
            al_save_bitmap("ekran.png",al_get_backbuffer(okno)); //zapisanie aktualnego obrazu okna
            bufor = al_load_bitmap("ekran.png");                 // załadowanie zapisanego obrazu

            koniec();
        }

    }
}
void info()
{
    ALLEGRO_COLOR bi = al_map_rgb( 200, 200, 200 ); // biały
    ALLEGRO_COLOR sz = al_map_rgb( 120, 200, 200 ); //szary
    ALLEGRO_COLOR csz = al_map_rgb( 100, 160, 160 ); // c.szary
    ALLEGRO_COLOR cz =al_map_rgba(0,0,0,150); // czarny
    ALLEGRO_COLOR zi =al_map_rgb(111,222,111); // zielony

    al_draw_filled_rectangle(a*6,a*4-10,a*14+x+10,a*11+a/3,al_map_rgba(0,0,0,180));
    al_draw_rectangle(a*6,a*4-10,a*14+x+10,a*11+a/3,cz,4);        // ramka czarna
    al_draw_rectangle(a*6,a*4-10,a*14+x+10,a*11+a/3,zi,2);  //    '' zielona
    al_draw_textf( f26, sz,a*6+(a*8+x)/2,a*4+15, 1, tt[14].c_str());
    al_draw_textf( f20, sz,a*6+(a*8+x)/2,a*4+38, 1, tt[15].c_str(),dd-1);
    al_draw_textf( f20, bi,a*6+30,a*4+65, 0, tt[16].c_str());
    al_draw_textf( f20, bi,a*6+30,a*4+85, 0, tt[17].c_str());
    int yt=120;
    for(int i=0; i<7; ++i)  al_draw_textf( f20, bi,a*6+50,a*4+yt,0, tt[18+i].c_str()),
        al_draw_textf( f20, bi,a*9+20,a*4+yt,0, tt[25+i].c_str()), yt+=20;
    al_draw_textf( f20,  sz,a*6+(a*8+x)/2,a*5+255,1, tt[32].c_str());
    al_draw_textf( f20, csz,a*6+(a*8+x)/2,a*5+280,1, "Autor: Marian Awgul   PL  2018");
    while(!myszka.buttons==2) al_get_mouse_state(&myszka);
}
void sp1()
{
    al_play_sample(samp1, 0.6, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,0);
}
void sp2()
{
    al_play_sample(samp2, 0.6, 0.0,1.0,ALLEGRO_PLAYMODE_ONCE,0);
}
void menu( int &wyj)
{
    ALLEGRO_COLOR sz = al_map_rgb( 150, 150, 150 );
    ALLEGRO_COLOR bi = al_map_rgb( 200, 200, 200 );
    ALLEGRO_COLOR ni = al_map_rgb( 100, 180, 180 );

    //przyciemnienie napisow górnej belki
    for(int i=0; i<21; ++i)
        al_draw_tinted_scaled_bitmap(el,al_map_rgba(12,12,12,6),400,450,5,5,0,15,1024,36,0);

    // --- rys. blok menu ---
    al_set_target_bitmap(obr);
    al_draw_bitmap(bufor,0,0,0);
    if(poz<dd)
    {
        al_set_target_bitmap(obr);
        al_draw_bitmap(bufor,0,0,0);
        al_draw_filled_rectangle(a*7,a*5-8+15,a*13+20,a*8+33+15,al_map_rgba(0,0,0,133)); // obszar menu
        al_draw_scaled_bitmap(el,320,88,10,28,a*7,a*5+6+6,a*6+20,28,0);
        al_draw_rectangle(a*7,a*5-8+15,a*13+20,a*8+33+15,al_map_rgb(0,0,0 ),4);          // ramka czarna
        al_draw_rectangle(a*7,a*5-8+15,a*13+20,a*8+33+15,al_map_rgb(111,222,111 ),2);    // ramka zielona
        al_draw_textf( f20, ni,515,a*5+4+15, 1,   tt[33].c_str());                 // napis MENU
        al_set_target_backbuffer(okno);
        al_draw_bitmap(obr,0,0,0);

        al_flip_display();
    }
    //---
    int y=0;
    while(1)
    {
        al_draw_bitmap(obr,0,0,0);
        mouse();
        al_get_keyboard_state(&klawisz); //sprawdzenie klawiatury
        y=45;
        al_draw_filled_rectangle(a*7+15,a*6-21+15,a*13+20-15,a*8+28-4+15,al_map_rgb(0,20,0)); // fło pod tekstami
        if(mz>60 && mz<65) al_draw_scaled_bitmap(el,0,160,10,32,a*7+30,a*5+31+15+35*(mz-61),260,35,0); // oznaczenie tekstów
        for(int i=0; i<4; ++i)
        {
            if(i!=mz-61)   al_draw_textf( f22, sz,512,a*5+y-5+15, 1, tt[38+i].c_str());  // teksty
            if(i==mz-61)    al_draw_textf( f22, bi,512,a*5+y-5+15, 1, tt[38+i].c_str()); // jaśniejsze teksty
            y+=35;
        }
        if(al_key_down(&klawisz, ALLEGRO_KEY_W) or (mz==61 && mb==1))             // wybranie planszy
        {
            wybieranie_planszy();
            return;
        }
        if(al_key_down(&klawisz, ALLEGRO_KEY_ENTER) or al_key_down(&klawisz, ALLEGRO_KEY_PAD_ENTER)
                or (mz==62 && mb==1)) return;  // powrot do gry
        if(al_key_down(&klawisz, ALLEGRO_KEY_X) or (mz==63 && mb==1))             // gra od nowa Restart
        {
            poz=1, nr=1, odbl=1, wczytanie_mapy();
            return;
        }
        if(al_key_down(&klawisz, ALLEGRO_KEY_ESCAPE) or (mz==64 && mb==1))        // wyjscie
        {
            wyj=1;
            return;
        }
        al_flip_display();
        al_rest(0.001);
    }
}
void zapis()
{
    // --- zaszyfrowanie i zapisanie danych --------
    fstream plik;
    string data;
    plik.open("xh.txt", ios::out ); // plik tymczasowy
    plik << speed <<" "<< sz << " "<< mu << " "<< poz <<" "<< odbl;
    plik.close();
    plik.open("xh.txt", ios::in ); // otwarcie pliku
    getline( plik, data);          // wczytanie danych do zniennej 'data'
    plik.seekg(0, ios::end);       // Przejście na koniec pliku
    int dl;
    dl = plik.tellg();             // długość pliku
    plik.close();
    remove("xh.txt");              //skasowanie pliku tymczasowego
    plik.open("media/dane.txt", ios::out ); // otwarcie pliku do zapisu
    for(int i=0; i < dl; ++i)
        plik << char(data[i]+i);            // zapisanie danych
    plik.close();
}
void laduj()
{
//--- sprawdzenie długości pliku map ---
    fstream plik;
    plik.open("media/mapy30.txt", ios::in ); // otwarcie pliku do odczytu
    getline(plik,tt[0]);
    getline(plik,tt[0]);
    plik.seekg( 0, ios::end );       // przesuniecie wskaznika na koniec
    int d=plik.tellg();              // rozmiar pliku
    plik.seekg( 0, ios::beg );       // powrot wskaznika na pocz.
    plik.close();//--------------------------
    dd=d/1042+1;                      // ustalenie liczby plansz
    string data="";
    plik.open("media/dane.txt", ios::in );
    plik.seekg( 0, ios::end );       // przesuniecie wskaznika na koniec
    d=plik.tellg();              // rozmiar pliku
    plik.seekg( 0, ios::beg );       // powrot wskaznika na pocz.
    if( plik.good() )
    {
        getline( plik, data);    // pobranie zaszyfrowanych danych do zniennej 'data'
        plik.close();
        plik.open("xh.txt", ios::out );  // plik tymczasowy
        for(int i=0; i<d+1; ++i)
            plik << char(data[i]-i);    //rozszyfrowanie i zapisanie danych
        plik.close();
        plik.open("xh.txt", ios::in );   // pobranie rozszyfrowanych danych
        plik >> speed >> sz >> mu >> poz >> odbl;
        plik.close();
        remove("xh.txt");//skasowanie pliku tymczasowego
    }

    else speed=0.002, sz=2, mu=0, poz=1, odbl=1;   // gdy nie ma pliku 'dane1.txt'
//   poz=40;
}
void wstep()
{
    al_set_target_bitmap(bufor);
    al_draw_textf( f26, al_map_rgb(100,180,180),512,350, 1, "Sokoban ROBACZKI");
    al_draw_textf( f20, al_map_rgb(100,180,180),678,351, 1, "XL v1.3");
    al_draw_line (500-120,375,500+210,375,al_map_rgb(80,150,150),1); //kreska
    al_draw_textf( f16, al_map_rgb(50,120,120),550,378, 1, "marianekA   PL-2018");
    al_set_target_backbuffer(okno);
}

void zamykanie_okien()
{
    znikanie_obrazu();
    al_destroy_display( okno );
    al_destroy_bitmap ( el );
    al_destroy_bitmap ( obr );
    al_destroy_bitmap ( bufor );
    al_destroy_bitmap ( tlo );
    al_destroy_bitmap ( gg );
    al_destroy_bitmap ( gg1 );
    al_destroy_bitmap ( tm );
    al_destroy_sample ( samp0 );
    al_destroy_sample ( samp1 );
    al_destroy_sample ( samp2 );
    al_destroy_sample ( samp3 );
    al_destroy_sample ( muz );
}

int main()
{
    init();
    laduj();
    nr=poz;                     //poziom
    if(poz==0 or poz>40) poz=1; // rsetowanie poziomu
    int kx=0,ky=0;                 // wsp. kloc
    int P=0,L=0,G=0,D=0,v=0,ss=0;  // zmienne dla ruchu sprita
    int os=0;                      // obraz sprita
    int wyj=0;                     // to do weyjscia
    wstep();
    //--- ukazywanie wstepu --
    for(int i=0; i<45; ++i)
    {
        al_draw_tinted_bitmap(bufor,al_map_rgba (i, i, i, i),0, 0, 0);
        al_rest(0.03);
        al_flip_display();
    }//---
    al_rest(1);     // mała pauza
    znikanie_obrazu();
    przes=0;
    wczytanie_mapy();
    start_planu();
    ukazywanie_obrazu_mapy();
    string rs="",rk="",s="",k="";
    int c=0; // zmienna użyta przy cofaniu ruchu
    int tx;  // długość tekstu w/g czcionki

    while(1)
    {
        al_get_keyboard_state(&klawisz); //spr. stanu klawiszawiatury
        mouse();
        //
        if(v==0)
        {
            // --- w przypadku wciśnięcia dwóch strzałek
            if((al_key_down(&klawisz,ALLEGRO_KEY_RIGHT) && al_key_down(&klawisz,ALLEGRO_KEY_LEFT))
                    or (al_key_down(&klawisz,ALLEGRO_KEY_DOWN) && al_key_down(&klawisz,ALLEGRO_KEY_UP)))
                goto kkk ;
            //---
            //w prawo
            //...jesli pole przed spritem jest wolne
            if(al_key_down(&klawisz, ALLEGRO_KEY_RIGHT )
                    && kaf[sx/a+2][sy/a+1]<4) P=1,L=0,G=0,D=0,os=1;
            //...jesli 2 pola sa zajete
            if(P==1 && ele[sx/a+2][sy/a+1]==5
                    && (ele[sx/a+3][sy/a+1]==5 || kaf[sx/a+3][sy/a+1]==4)) P=0,ss=0; //klocek;
            //...jesli jest klocek do pzesuniecia
            if(P==1 && ele[sx/a+2][sy/a+1]==5) ss=1, ele[sx/a+2][sy/a+1]=0, ++przes; //klocek
            if(mu==0 && P==1 && ss==1 ) sp1(); //s1
            if(mu==0 && P==1 && ss==1 && (kaf[sx/a+4][sy/a+1]==4 ||ele[sx/a+4][sy/a+1]==5))sp2(); //s2
            //w lewo -------------
            if(al_key_down(&klawisz, ALLEGRO_KEY_LEFT )
                    && kaf[sx/a ][sy/a+1] <4) P=0,L=1,G=0,D=0,os=2;
            if(L==1 && ele[sx/a ][sy/a+1]==5
                    && (ele[sx/a-1][sy/a+1]==5 || kaf[sx/a-1][sy/a+1]==4)) L=0,ss=0;
            if(L==1 && ele[sx/a ][sy/a+1]==5) ss=1, ele[sx/a ][sy/a+1]=0,++przes;
            // dzwieki
            if(mu==0 && L==1 && ss==1 )sp1();
            if(mu==0 && L==1 && ss==1 &&  (kaf[sx/a-2][sy/a+1]==4 || ele[sx/a-2][sy/a+1]==5))sp2();
            //w gore -------------
            if(al_key_down(&klawisz, ALLEGRO_KEY_UP )
                    && kaf[sx/a+1][sy/a ] <4) P=0,L=0,G=1,D=0,os=3;
            if(G==1 && ele[sx/a+1][sy/a ]==5
                    && (ele[sx/a+1][sy/a-1]==5 || kaf[sx/a+1][sy/a-1]==4)) G=0,ss=0;
            if(G==1 && ele[sx/a+1][sy/a ]==5) ss=1, ele[sx/a+1][sy/a]=0,++przes;
            if(mu==0 && G==1 && ss==1 )sp1();
            if(mu==0 && G==1 && ss==1 &&  (kaf[sx/a+1][sy/a-2]==4 ||ele[sx/a+1][sy/a-2]==5))sp2();
            //w dół --------------
            if(al_key_down(&klawisz, ALLEGRO_KEY_DOWN ) && kaf[sx/a+1][sy/a+2] <4) P=0,L=0,G=0,D=1,os=4;
            if(D==1 && ele[sx/a+1][sy/a+2]==5
                    && (ele[sx/a+1][sy/a+3]==5 || kaf[sx/a+1][sy/a+3]==4)) D=0,ss=0;
            if(D==1 && ele[sx/a+1][sy/a+2]==5) ss=1, ele[sx/a+1][sy/a+2]=0,++przes;
            if(mu==0 && D==1 && ss==1 )sp1();
            if(mu==0 && D==1 && ss==1 &&  (kaf[sx/a+1][sy/a+4]==4 ||ele[sx/a+1][sy/a+4]==5))sp2();
        }
kkk:
        //--- zapamietanie ruchu sprita ----------------
        if (P==1 && v==1) rs=rs+"P";
        if (L==1 && v==1) rs=rs+"L";
        if (G==1 && v==1) rs=rs+"G";
        if (D==1 && v==1) rs=rs+"D";
        // --- zap. ruchu klocka ---
        if(ss==0 && v==1) rk=rk+"-";
        if(P==1 && ss==1 && v==1) rk=rk+"P";
        if(L==1 && ss==1 && v==1) rk=rk+"L";
        if(G==1 && ss==1 && v==1) rk=rk+"G";
        if(D==1 && ss==1 && v==1) rk=rk+"D";
        //----------------------------------------------
        kx=sx,ky=sy;        //wsp. klocka
        if(P==1) ++v, ++sx, kx=sx+a; // w prawo
        if(L==1) ++v, --sx, kx=sx-a; // w lewo
        if(G==1) ++v, --sy, ky=sy-a; // w gore
        if(D==1) ++v, ++sy, ky=sy+a; // w dol
        // -- nowa pozycja klocka w tablicy 'ele' ---
        if(P==1 && ss==1 && v==a) ele[sx/a+1][sy/a+1]=0, ele[sx/a+2][sy/a+1]=5;
        if(L==1 && ss==1 && v==a) ele[sx/a+1][sy/a+1]=0, ele[sx/a ][sy/a+1]=5;
        if(D==1 && ss==1 && v==a) ele[sx/a+1][sy/a+1]=0, ele[sx/a+1][sy/a+2]=5;
        if(G==1 && ss==1 && v==a) ele[sx/a+1][sy/a+1]=0, ele[sx/a+1][sy/a ]=5;
        //-------------------------
        traf=0;
        rysowanie_planu();
        if(ss==1 && v<a) al_draw_bitmap_region(el,1*a,1*a,a,a,kx,ky,0); // wyswietlanie klocka przesuwanego
        if(v==0) os=0;   // neutralny obraz sprita
        if(traf<rob) al_draw_bitmap_region(el,os*a,2*a,a,a,sx,sy,0); // wyswietlenie sprita

        // szybkosc gry ---
        tx=  al_get_text_width(f20,tt[44].c_str()); // długość tekstu w px.
        al_draw_textf( f20, al_map_rgb(188,188,188),60,8+15, 0, tt[44].c_str());
        al_draw_textf( f22, al_map_rgb(222,222,22),50+tx+8,8+13, 0, " %d",sz);

        if ( al_key_down(&klawisz, ALLEGRO_KEY_S) && v==0)
        {
            if(sz>3) sz=0, speed=0;
            ++sz;
            if(sz==1) speed=0.003;
            if(sz==2) speed=0.002;
            if(sz==3) speed=0.001;
            if(sz==4) speed=0.000;

            while ( al_key_down(&klawisz, ALLEGRO_KEY_S )) al_get_keyboard_state(&klawisz);
        }
        //-------------------
        //--- belka
        al_draw_textf( f20, al_map_rgb(188,188,188),420,22, 2, tt[45].c_str());
        al_draw_textf( f20, al_map_rgb(222,222,22),420,22, 0, "%d",przes); // licznik przesówanych bloków
        al_draw_textf( f20,al_map_rgb(188,188,188),640,8+15,2, tt[43].c_str(),nr); // tekst Poziom
        al_draw_textf( f22,al_map_rgb(222,222,2),645,8+13,0, "%d",nr); // licznik poziomu

        al_draw_bitmap_region(el,10,160,300,36,740,13,0);      // text 'info replay menu'
        if(mz==101) al_draw_bitmap_region(el, 10,205,60,25,741,19,0); // podswietlony Info
        if(mz==102) al_draw_bitmap_region(el, 80,205,90,25,811,19,0); //   ''         Replay
        if(mz==103) al_draw_bitmap_region(el,180,205,70,25,911,19,0); //   ''         Menu
        //---
        if ( al_key_down(&klawisz, ALLEGRO_KEY_I) || (mz==101 && mb==1)) info(); // info
        if ( al_key_down(&klawisz, ALLEGRO_KEY_R) || (mz==102 && mb==1))         // replay
            wczytanie_mapy(), rs="", rk="", s="", k="", przes=0;                 // replay
        if (traf==rob) zapis(), gratulacje(), rs="", rk="", s="", k="", przes=0;   // OK
        if (mz==103 && mb==1)  menu(wyj);                                         // menu

        //--- cofanie --------------------------------------------------
        c=0;
        if ( v==0 && al_key_down(&klawisz, ALLEGRO_KEY_BACKSPACE) && rs.size()>0)
        {
            c=1;
            s = rs[rs.size()-1]; // ostatni znak
            if( s =="P") sx=sx-a;
            if( s =="L") sx=sx+a;
            if( s =="G") sy=sy+a;
            if( s =="D") sy=sy-a;
            rs.erase(rs.size()-1,1); // obcina ostatni znak
            //--- klocek
            k =rk[rk.size()-1]; // ostatni znak
            if( k =="P") ele[sx/a+3][sy/a+1]=0, ele[sx/a+2][sy/a+1]=5, ++przes;
            if( k =="L") ele[sx/a-1][sy/a+1]=0, ele[sx/a ] [sy/a+1]=5, ++przes;
            if( k =="G") ele[sx/a+1][sy/a-1]=0, ele[sx/a+1][sy/a ]=5,  ++przes;
            if( k =="D") ele[sx/a+1][sy/a+3]=0, ele[sx/a+1][sy/a+2]=5, ++przes;

            if( k =="P" && mu==0) sp1();
            if( k =="L" && mu==0) sp1();
            if( k =="G" && mu==0) sp1();
            if( k =="D" && mu==0) sp1();

            rk.erase(rk.size()-1,1); // obcina ostatni znak
        }//----------------------------------------------------------------------
        // dzwieki / sample - On/OFF -------------------------------
        if ( al_key_down(&klawisz, ALLEGRO_KEY_M) && v==0)
        {
            ++mu;
            if(mu>1) mu=0;
            while ( al_key_down(&klawisz, ALLEGRO_KEY_M )) al_get_keyboard_state(&klawisz);
        }
        al_draw_bitmap_region(el,350,175,50,30,x+470,15,0); // znak głośnika
        // --- przyciemnienie głośnika ---
        if(mu==1)
            al_draw_tinted_bitmap_region(el,al_map_rgba(10,10,10,150),350,175,50,30,x+470,15,0);

        // ----- zmiana wielkości ekranu -----
        if( al_key_down(&klawisz, ALLEGRO_KEY_F12 ))
        {
            ++ekr;
            if(ekr>1)  ekr=0;
            al_save_bitmap("ekran.png",tlo);
            zamykanie_okien();
            init();
            tlo = al_load_bitmap("ekran.png");
            ukazywanie_obrazu_mapy();
        }
        // -----
        //----------------------------------------------------------
        al_flip_display(); // wsio na ekran
        if(v==a) v=0, P=0, L=0, G=0, D=0, ss=0; // zerowanie kierunkow
        al_rest(speed);             // zwolnienie(pauza_
        if(ss>0) al_rest(0.001);    // dod. zwolnienie przy przesuwaniu klocka
        if(c==1) al_rest(0.1);      // zwolnienie przy cofaniu ruchu
        if ( al_key_down(&klawisz, ALLEGRO_KEY_ESCAPE) or wyj==1) break;               // koniec
    }
    remove("ekran.png");//skasowanie pliku tymczasowego
    zapis();
    zamykanie_okien();
    return 0;
}
